In order to allow for future enhancements, frs_setattr() accepts arguments for minor frame number and process ID; however it currently only allows setting exception policies for all policies and all minor frames. The most significant argument to it is the frs_recv_info structure, declared with these fields.
typedef struct frs_recv_info { mfbe_rmode_t rmode; /* Basic recovery mode */ mfbe_tmode_t tmode; /* Time expansion mode */ uint maxcerr; /* Max consecutive errors */ uint xtime; /* Recovery extension time */ } frs_recv_info_t;The recovery modes and other constants are declared in /usr/include/sys/frs.h. The function in Example 7-3 sets the policy of injecting a repeat frame. The caller specifies only the Frame Scheduler and the number of consecutive exceptions allowed.
Example 7-3 : Function to Set INJECTFRAME Exception Policy
int setInjectFrameMode(frs_t *frs, int consecErrs) { frs_recv_info_t work; bzero((void*)&work,sizeof(work)); work.rmode = MFBERM_INJECTFRAME; work.maxcerr = consecErrs; return frs_setattr(frs,0,0,FRS_ATTR_RECOVERY,(void*)&work); }The function in Example 7-4 sets the policy of stretching the current frame (a function to set the policy of stealing time from the next frame would be nearly identical). The caller specifies the Frame Scheduler, the number of consecutive exceptions, and the stretch time in microseconds.
Example 7-4 : Function to Set STRETCH Exception Policy
int setStretchFrameMode(frs_t *frs,int consecErrs,uint microSecs) { frs_recv_info_t work; bzero((void*)&work,sizeof(work)); work.rmode = MFBERM_EXTENDFRAME_STRETCH; work.tmode = EFT_FIXED; /* only choice available */ work.maxcerr = consecErrs; work.xtime = microSecs; return frs_setattr(frs,0,0,FRS_ATTR_RECOVERY,(void*)&work); }